/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package co.edu.senaclem.persistencia;

import co.edu.senaclem.modelo.Area;
import co.edu.senaclem.modelo.ClienteExterno;
import co.edu.senaclem.modelo.Turno;
import static co.edu.senaclem.persistencia.Persistencia.areadb;
import static co.edu.senaclem.persistencia.Persistencia.con;
import static co.edu.senaclem.persistencia.Persistencia.conectar;
import static co.edu.senaclem.persistencia.Persistencia.desconectar;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;

/**
 *
 * @author anfeles
 */
@Stateless
public class TurnoDAO implements ITurnoDAO{

    public static ResultSet resSet=null;
    
    @Override
    public void modificar(Turno turno) throws Exception {
        try {            
            if (conectar()) { 
              
                String actualizacion = "update turno set estadoturno='ATENDIDO',observacionesturno='"+turno.getObservaciones()+"', horasalidaturno='"+turno.getHoraSalida()+"' where codigoturno='" + turno.getCodigo() + "'";
                areadb = con.createStatement();
                areadb.execute(actualizacion); 
              
                desconectar();
            }
          
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public void insertar(Turno turno) throws Exception {
        try {
            if (conectar()) {
                
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");                
                String fechaTurno= sdf.format(turno.getFecha());
                
                String consulta = "insert into turno (codigoarea,documentocliente,numeroturno,fechaturno,horaingresoturno,horasalidaturno,motivoturno,estadoturno,observacionesturno) values('" + 
                        turno.getArea().getCodigo() + "','" + turno.getDocumentoCliente().getDocumento().getDocumento() +"','"+turno.getNumero()+"','"+fechaTurno+"','"+turno.getHoraIngreso()+"','"+
                        turno.getHoraSalida()+"','"+turno.getMotivo()+"','"+turno.getEstado()+"','"+turno.getObservaciones()+ "')";
                areadb = con.createStatement();
                areadb.execute(consulta);
                
                //consultar si hay turnos pendientes del dia anterior para cerrarlos
                Calendar calendar = Calendar.getInstance();
                calendar.setTime(turno.getFecha()); // Configuramos la fecha que se recibe
                calendar.add(Calendar.DAY_OF_YEAR, -1);  // numero de días a añadir, o restar en caso de días<0 
                String fechaAnterior= sdf.format(calendar.getTime());
                //System.out.println("Fecha restada: "+fechaAnterior);
                
                String consultaCerrar = "Select * From turno where fechaturno <='"+fechaAnterior+"' and estadoturno='PENDIENTE'";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consultaCerrar);
                //si hay pendientes se cierran los turnos
                if (resSet.next()) {
                    cerrarTurnos(fechaAnterior);
                }
                
                resSet.close();
                
                desconectar();
            }
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public Turno consultarPorId(int codigo) throws Exception {
        try {
            Turno miTurno = null;
            if (conectar()) {
                String consulta = "Select * From turno where codigoturno='" + codigo + "'";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);

                if (resSet.next()) {
                    miTurno = new Turno();
                    miTurno.setCodigo(codigo);
                    miTurno.setEstado(resSet.getString("estadoturno"));  
                    miTurno.setFecha(resSet.getDate("fechaturno"));
                    miTurno.setHoraIngreso(resSet.getString("horaingresoturno"));
                    miTurno.setHoraSalida(resSet.getString("horasalidaturno"));
                    miTurno.setMotivo(resSet.getString("motivoturno"));
                    miTurno.setNumero(resSet.getInt("numeroturno"));
                    miTurno.setObservaciones(resSet.getString("observacionesturno"));
                    
                    IClienteExternoDAO clienteDAO=new ClienteExternoDAO();
                    ClienteExterno miCliente=clienteDAO.consultarPorId(resSet.getLong("documentocliente"));  
                    IAreaDAO areaDAO = new AreaDAO();
                    Area miArea=areaDAO.consultarPorId(resSet.getInt("codigoarea")); 
                    
                    miTurno.setDocumentoCliente(miCliente);
                    miTurno.setArea(miArea); 
                }

                resSet.close();
                desconectar();
            }

            return miTurno;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public List<Turno> consultar() throws Exception {
        try {
            List<Turno> turnos = new ArrayList<Turno>();
            if (conectar()) {                
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");                
                String fechaSistema= sdf.format(new Date());
                
                String consulta = "Select * From turno where fechaturno='" + fechaSistema + "'";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);

                while (resSet.next()) {
                    Turno miTurno = new Turno();
                    miTurno.setCodigo(Integer.parseInt(resSet.getString("codigoturno")));
                    miTurno.setNumero(resSet.getInt("numeroturno"));
                    miTurno.setFecha(resSet.getDate("fechaturno"));
                    miTurno.setHoraIngreso(resSet.getString("horaingresoturno"));                   
                    miTurno.setHoraSalida(resSet.getString("horasalidaturno"));                    
                    miTurno.setMotivo(resSet.getString("motivoturno"));
                    miTurno.setEstado(resSet.getString("estadoturno"));                     
                    miTurno.setObservaciones(resSet.getString("observacionesturno"));
                    
                    IClienteExternoDAO clienteDAO=new ClienteExternoDAO();
                    ClienteExterno miCliente=clienteDAO.consultarPorId(resSet.getLong("documentocliente"));  
                    IAreaDAO areaDAO = new AreaDAO();
                    Area miArea=areaDAO.consultarPorId(resSet.getInt("codigoarea")); 
                    
                    miTurno.setDocumentoCliente(miCliente);
                    miTurno.setArea(miArea); 
                    
                    turnos.add(miTurno);
                }

                resSet.close();
                desconectar();
            }

            return turnos;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public int consultarNumeroTurno(Date fecha, int codigoArea) throws Exception {
        try {
            int miNumero = 0;
            if (conectar()) {                
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");                
                String fechaSistema= sdf.format(fecha);
                
                String consulta = "Select IFNULL(max(numeroturno), 0) as ultimoturno From turno where fechaturno='"+fechaSistema+"' and codigoarea='"+codigoArea+"'";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);

                if (resSet.next()) {
                    miNumero = resSet.getInt("ultimoturno");                    
                }

                resSet.close();
                desconectar();
            }

            return miNumero;
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public void cerrarTurnos(String fecha) throws Exception {
        try {            
            if (conectar()) {               
                String actualizacion = "update turno set estadoturno='CERRADO',observacionesturno='Usuario No Acude al Turno' where fechaturno <='" + fecha + "' and estadoturno='PENDIENTE'";
                areadb = con.createStatement();
                areadb.execute(actualizacion); 
              
                desconectar();
            }
          
        } catch (RuntimeException e) {
            throw e;
        }
    }

    @Override
    public List<Turno> consultar(String consulta) throws Exception {
        try {
            List<Turno> turnos = new ArrayList<Turno>();
            if (conectar()) {
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);

                while (resSet.next()) {
                    Turno miTurno = new Turno();
                    miTurno.setCodigo(Integer.parseInt(resSet.getString("codigoturno")));
                    miTurno.setNumero(resSet.getInt("numeroturno"));
                    miTurno.setFecha(resSet.getDate("fechaturno"));
                    miTurno.setHoraIngreso(resSet.getString("horaingresoturno"));
                    miTurno.setHoraSalida(resSet.getString("horasalidaturno"));
                    miTurno.setMotivo(resSet.getString("motivoturno"));
                    miTurno.setEstado(resSet.getString("estadoturno"));                     
                    miTurno.setObservaciones(resSet.getString("observacionesturno"));
                    
                    IClienteExternoDAO clienteDAO=new ClienteExternoDAO();
                    ClienteExterno miCliente=clienteDAO.consultarPorId(resSet.getLong("documentocliente"));  
                    IAreaDAO areaDAO = new AreaDAO();
                    Area miArea=areaDAO.consultarPorId(resSet.getInt("codigoarea")); 
                    
                    miTurno.setDocumentoCliente(miCliente);
                    miTurno.setArea(miArea); 
                    
                    turnos.add(miTurno);
                }

                resSet.close();
                desconectar();
            }

            return turnos;
        } catch (RuntimeException e) {
            throw e;
        }
    }
    
    @Override
    public List<Turno> consultarTurnosArea(Area area, String fechaSistema) throws Exception {
        try {
            List<Turno> misTurnos = new ArrayList<Turno>();
            if (conectar()) {
                String consulta = "Select * From turno where codigoarea='" + area.getCodigo() + "' and fechaturno='"+fechaSistema+"'";
                areadb = con.createStatement();
                resSet = areadb.executeQuery(consulta);

                while (resSet.next()) {                    
                    Turno miTurno = new Turno();
                    miTurno.setCodigo(resSet.getInt("codigoturno"));
                    miTurno.setEstado(resSet.getString("estadoturno"));  
                    miTurno.setFecha(resSet.getDate("fechaturno"));
                    miTurno.setHoraIngreso(resSet.getString("horaingresoturno"));
                    miTurno.setHoraSalida(resSet.getString("horasalidaturno"));
                    miTurno.setMotivo(resSet.getString("motivoturno"));
                    miTurno.setNumero(resSet.getInt("numeroturno"));
                    miTurno.setObservaciones(resSet.getString("observacionesturno"));
                    
                    IClienteExternoDAO clienteDAO=new ClienteExternoDAO();
                    ClienteExterno miCliente=clienteDAO.consultarPorId(resSet.getLong("documentocliente"));  
                    IAreaDAO areaDAO = new AreaDAO();
                    Area miArea=areaDAO.consultarPorId(resSet.getInt("codigoarea")); 
                    
                    miTurno.setDocumentoCliente(miCliente);
                    miTurno.setArea(miArea); 
                    
                    misTurnos.add(miTurno);
                }

                resSet.close();
                desconectar();
            }

            return misTurnos;
        } catch (RuntimeException e) {
            throw e;
        }
    }    
    
    
    
}
